#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
#include <cstring>

using namespace std;

// 飞行路线（语言提供的堆）
// Alice和Bob现在要乘飞机旅行，他们选择了一家相对便宜的航空公司
// 该航空公司一共在n个城市设有业务，设这些城市分别标记为0 ~ n−1
// 一共有m种航线，每种航线连接两个城市，并且航线有一定的价格
// Alice 和 Bob 现在要从一个城市沿着航线到达另一个城市，途中可以进行转机
// 航空公司对他们这次旅行也推出优惠，他们可以免费在最多k种航线上搭乘飞机
// 那么 Alice 和 Bob 这次出行最少花费多少
// 测试链接 : https://www.luogu.com.cn/problem/P4568
// 提交以下所有代码，可以直接通过

const int MAXN = 10001; // 城市的最大数量
const int MAXM = 100001; // 有向边的最大数量
const int MAXK = 11; // 免费乘坐的最大次数

// 链式前向星需要的
int head[MAXN];
int next[MAXM];
int to[MAXM];
int weight[MAXM];
int cnt;

// Dijkstra 需要的
int dist[MAXN][MAXK];
bool visited[MAXN][MAXK];

// 用语言自己提供的堆
// 动态结构，不推荐
// 0 : 沿途的花费
// 1 : 到达的城市编号
// 2 : 已经使用的免单次数
priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> q;

// 输入的参数
int n, m, k, s, t;

const int INF = 0x3f3f3f3f;

void build(int n)
{
    cnt = 1;
    memset(head, 0, sizeof(head));
    memset(visited, 0, sizeof(visited));
    memset(dist, 0x3f, sizeof(dist));
}

void addEdge(int u, int v, int w)
{
    ::next[cnt] = head[u];
    to[cnt] = v;
    weight[cnt] = w;
    head[u] = cnt++;
}

int dijkstra()
{
    dist[s][0] = 0;
    // 0 : 沿途的花费
    // 1 : 到达的城市编号
    // 2 : 已经使用的免单次数
    // 将沿途的花费放在 0 位置的目的是，能使用标准库中实现的比较器
    // 库中的比较器是依次比较 0,1,2 位置上的数字大小，直至比较出结果
    q.emplace(0, s, 0);
    while(!q.empty())
    {
        auto [cost, u, use] = q.top();
        q.pop();
        if(visited[u][use]) continue;

        visited[u][use] = true;
        // 常见剪枝
        // 发现终点直接返回
        // 不用等都结束
        if(u == t) return cost;
        // 链式前向星遍历
        for(int ei = head[u]; ei > 0; ei = ::next[ei])
        {
            int v = to[ei], w = weight[ei];
            // 使用免费次数：加 + 0 表示使用了免费次数
            if(use < k && dist[v][use + 1] > dist[u][use] + 0)
            {
                dist[v][use + 1] = dist[u][use] + 0;
                q.emplace(dist[v][use + 1], v, use + 1);
            }
            // 不使用免费次数
            if(dist[v][use] > dist[u][use] + w)
            {
                dist[v][use] = dist[u][use] + w;
                q.emplace(dist[v][use], v, use);
            }
        }
    }

    return -1;
}

int main()
{
    cin >> n >> m >> k >> s >> t;
    build(n);
    for(int i = 0; i < m; ++i)
    {
        int u, v, w;
        cin >> u >> v >> w;
        addEdge(u, v, w);
        addEdge(v, u, w);
    }    
    cout << dijkstra() << endl;

    return 0;
}